package main
import (
	"fmt"
	"context"
	"time"
)

/*
	context.WithValue 能从父 Context中创建一个子子 Context,并传一个键值对信息给子 Context，
	在子 Context中，通过context.Value获取对应的值信息
	Return:
	    返回一个包含父 context 传递信息的子 context
*/
func main() {
	fmt.Printf("Begin:%s\n", time.Now())
    // 基于context.Background()为根，创建一个5秒后自动取消的子Context
    parentCtx, cancelFunc := context.WithCancel(context.Background())
    // 传体信息
    valueCtx := context.WithValue(parentCtx, "name", "张三")
    go func(ctx context.Context,cancelFunc2 context.CancelFunc) {
        // 取出上下文中key=name的值
        fmt.Printf("取出上下文中的name: %v\n",ctx.Value("name"))
        // 子协程发送取消信号
        cancelFunc()
    }(valueCtx,cancelFunc)
    // 等待工作完成或者上下文被取消
    <- parentCtx.Done()
    fmt.Printf("End：%s \n", time.Now())
}
